﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using LapvComponent;
using log4net;
using LapvBussiness;

namespace Lapv.Account
{
    public partial class RoleAdd : System.Web.UI.Page
    {
        private static readonly ILog log = LogManager.GetLogger(typeof(RoleAdd).Name);
        public string domainStyle = ConfigLapv.Instance.DomainStyle;
        public string domain =ConfigLapv.Instance.DomainAdmin;
        protected void Page_Load(object sender, EventArgs e)
        {
            string curUrl = Request.RawUrl.ToString();
            ProviderAdmin.CheckAuthen(curUrl, 9);
            if (Page.IsPostBack) return;
            int roleid = -1;
            if (Request.Params["roleid"] != null)
                int.TryParse(Request.Params["roleid"].ToString().Trim().Replace("'", ""), out roleid);
            bindData(roleid);
        }

        private void bindData(int roleid)
        {

            using (lapvEntities db = new lapvEntities())
           {

                if (roleid > 0)
                {
                    bt_luu.Text = "Lưu ";
                    txtID.Enabled = false;
                    role obj = db.roles.Include("role_permission").Include("role_permission.permission").Where(en => en.id == roleid).FirstOrDefault();
                    if (obj != null)
                    {
                        txtID.Text = obj.id.ToString();
                        txtID.Enabled = false;
                        txtRole.Text = obj.name;
                        List<role_permission> lstRolePer = obj.role_permission.ToList();
                        List<permission> lstPers = db.permissions.ToList();
                        chkPermission.DataSource = lstPers;
                        chkPermission.DataTextField = "name";
                        chkPermission.DataValueField = "id";
                        chkPermission.DataBind();
                        short val = -1;
                        foreach (ListItem it in chkPermission.Items)
                        {
                            val = short.Parse(it.Value);
                            if (lstRolePer.Where(en => en.permission.id == val).Count() > 0)
                                it.Selected = true;
                        }
                    }
                    else
                    {
                         ((Lapv)this.Master).MessageError = "Không tồn tại role có mã là " + roleid;
                    }
                }
                else
                 {
                    
                     bt_luu.Text = "Thêm";
                     List<permission> lstPers = db.permissions.ToList();
                     chkPermission.DataSource = lstPers;
                     chkPermission.DataTextField = "name";
                     chkPermission.DataValueField = "id";
                     chkPermission.DataBind();
                 }

                List<role> lstRole = db.roles.Include("role_permission").Include("role_permission.permission").ToList();
                List<NewRole> roles = new List<NewRole>();
                NewRole newObj = null;
                string s = "";
                foreach (role r in lstRole)
                {
                    newObj = new NewRole();
                    newObj.id = r.id;
                    newObj.name = r.name;
                    s = "";
                    foreach (role_permission rp in r.role_permission)
                    {
                        s += rp.permission.name + ", ";
                    }
                    if (!string.IsNullOrEmpty(s))
                        s = s.Substring(0, s.Length - 2);
                    newObj.permissions = s;
                    roles.Add(newObj);
                }

                dtgrid.DataSource = roles;
                dtgrid.DataBind();
            }
        }
        class NewRole
        {
            public int id { get; set; }
            public string name { get; set; }
            public string permissions { get; set; }
        }
        public void Update_ItemCommand(object sender, DataGridCommandEventArgs e)
        {

            short roleid = -1;
            if (e.CommandArgument.ToString().Trim() != "")
                roleid = short.Parse(e.CommandArgument.ToString().Trim());
            switch (e.CommandName.ToString().Trim())
            {

                case "Delete":
                    string msg = "";
                    try
                    {
                        using (lapvEntities db = new lapvEntities())
                        {
                            if (roleid > 0)
                            {
                                role obj = db.roles.Where(en => en.id == roleid).FirstOrDefault();
                                if (obj != null)
                                {
                                    db.DeleteObject(obj);
                                    db.SaveChanges();
                                    msg = "Xóa Role thành công có mã là " + roleid;
                                    Response.Redirect(this.Request.Url.ToString());
                                }
                                else
                                {
                                    msg = "Xóa Role không thành công do không tồn tại role có mã là " + roleid;
                                    ((Lapv)this.Master).MessageError = "Không tồn tại đối tượng có mã là " + roleid;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        msg = "Xóa Role không thành công do không tồn tại role có mã là " + roleid;
                        log.Error(ex.Message, ex);
                        ((Lapv)this.Master).MessageError = "Xóa role có mã " + roleid + " không thành công do " + ex.Message;
                    }

                    try
                    {
                        int uid = 0;
                        string uname = string.Empty;
                        uid = ProviderAdmin.GetUsserId();
                        if (Session["UserName"] != null)
                            uname = Session["UserName"].ToString();
                        ProviderAdmin.AddLog(uid, uname, msg, string.Empty, "ROLE_DELETE");
                    }
                    catch (Exception ex)
                    {
                        log.Error(ex.Message, ex);
                    }
                    break;
                case "Edit":
                    Response.Redirect(domain + "Account/RoleAdd.aspx?roleid=" + roleid);
                    break;
            }

        }

        protected void btnEdit_Click(object sender, EventArgs e)
        {
            string msg = "";
            string logtype = "";
            int roleid = -1;
            if (Request.Params["roleid"] != null)
                int.TryParse(Request.Params["roleid"].ToString().Trim().Replace("'", ""), out roleid);
            try
            {
                if (string.IsNullOrEmpty(txtRole.Text.Trim()))
                {
                    ((Lapv)this.Master).MessageError = "Tên quyền không được để trống";
                    return;
                }
                using (lapvEntities db = new lapvEntities())
                {

                    if (roleid > 0)
                    {
                        logtype = "ROLE_EDIT";
                        role obj = db.roles.Include("role_permission").Include("role_permission.permission").Where(en => en.id == roleid).FirstOrDefault();
                        if (obj != null)
                        {
                            obj.name = txtRole.Text.Trim();
                            role_permission newobj = null;
                            List<role_permission> oldRP = obj.role_permission.ToList();
                            if (oldRP.Count > 0)
                            {
                                foreach (role_permission it in oldRP)
                                {
                                    //obj.role_permission.Remove(it);
                                    db.DeleteObject(it);
                                }
                                //db.ApplyPropertyChanges(obj.EntityKey.EntitySetName, obj);
                                db.SaveChanges();
                            }
                            bool kt = false;
                            foreach (ListItem it in chkPermission.Items)
                            {
                                if (it.Selected == true)
                                {
                                    newobj = new role_permission();
                                    newobj.roleReference.EntityKey = new System.Data.EntityKey("lapvEntities.role", "id", roleid);
                                    newobj.permissionReference.EntityKey = new System.Data.EntityKey("lapvEntities.permission", "id",12);
                                    obj.role_permission.Add(newobj);
                                    //it.Value
                                    if (kt == false) kt = true;
                                }
                            }
                            if (kt == true)
                            {
                                db.ApplyCurrentValues(obj.EntityKey.EntitySetName, obj);
                                db.SaveChanges();
                            }
                            msg = "Cập nhật quyền thành công với mã quyền " + roleid;
                            Response.Redirect(domain + "Account/RoleAdd.aspx");

                        }
                        else
                        {
                            msg = "Cập nhật quyền bị lỗi với mã quyền " + roleid + ". Do không tồn tại đối tượng";
                            ((Lapv)this.Master).MessageError = "Không tồn tại đối tượng có mã là " + roleid;
                        }
                    }
                    else
                    {
                        logtype = "ROLE_ADD";
                        int.TryParse(txtID.Text.Trim(), out roleid);
                        if (roleid <= 0)
                        {
                            ((Lapv)this.Master).MessageError = "Mã quyền phải là số nguyên dương";
                            return;
                        }
                        if (db.roles.Where(en => en.id == roleid).Count() > 0)
                        {
                            ((Lapv)this.Master).MessageError = "Đã tồn tại bản ghi có mã quyền " + roleid;
                            return;
                        }
                        role obj = new role();
                        obj.id = roleid;
                        obj.name = txtRole.Text.Trim();
                        db.AddToroles(obj);
                        db.SaveChanges();
                        role_permission newobj = null;
                        bool kt = false;
                        foreach (ListItem it in chkPermission.Items)
                        {
                            if (it.Selected == true)
                            {
                                newobj = new role_permission();
                                newobj.roleReference.EntityKey = new System.Data.EntityKey("lapvEntities.role", "id", roleid);
                                newobj.permissionReference.EntityKey = new System.Data.EntityKey("lapvEntities.permission", "id", short.Parse(it.Value));
                                obj.role_permission.Add(newobj);
                                if (kt == false) kt = true;
                            }
                        }
                        if (kt == true)
                        {
                            db.ApplyCurrentValues(obj.EntityKey.EntitySetName, obj);
                            db.SaveChanges();
                        }
                        msg = "Thêm quyền thành công với mã quyền " + roleid;
                        Response.Redirect(domain + "Account/RoleAdd.aspx");
                    }
                }
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
                if (logtype == "ROLE_EDIT")
                    msg = "Cập nhật quyền bị lỗi với mã quyền " + roleid + ". Do " + ex.Message;
                else
                    msg = "Thêm mới quyền bị lỗi. Do " + ex.Message;
                ((Lapv)this.Master).MessageError = "Có lỗi xảy ra trong quá trình lưu dữ liệu " + ex.Message;
            }

            try
            {
                int uid = 0;
                string uname = string.Empty;
                uid = ProviderAdmin.GetUsserId();
                if (Session["UserName"] != null)
                    uname = Session["UserName"].ToString();
                ProviderAdmin.AddLog(uid, uname, msg, string.Empty, logtype);
            }
            catch (Exception ex)
            {
                log.Error(ex.Message, ex);
            }
        }

    }
}
